#include <stdio.h>
#include "vfc_type.h"

struct a
{
	const int * test(int,int)
	{
		return NULL;
	}

	void test1() const
	{
	}
	const char * test2(int, int) volatile
	{
		return NULL;
	}
	const int & test3(int *, const char *) const volatile
	{
		static int i = 100;
		return i;
	}
};

void test(const char *, int k)
{
};

struct b
{
};

VFC_TYPE_ID(a,0x2000);


int main(int argc, char* argv[])
{
	typedef void (*T1)(void);
	typedef int (*T2)(void);
	typedef int (*T3)(int,int,int,int,int,int,int,int,int);
	typedef const char * (*T4)(int &,int *,char **,char &,const int &);

	typedef int U1;
	typedef int U2[5];
	typedef const int & U3;
	typedef char U4[5][6][7];

	printf("T1 type %s\n",vfc::type_id_t<T1>().name());
	printf("T2 type %s\n",vfc::type_id_t<T2>().name());
	printf("T3 type %s\n",vfc::type_id_t<T3>().name());
	printf("T4 type %s\n",vfc::type_id_t<T4>().name());

	printf("U1 type %s\n",vfc::type_id_t<U1>().name());
	printf("U2 type %s\n",vfc::type_id_t<U2>().name());
	printf("U3 type %s\n",vfc::type_id_t<U3>().name());
	printf("U4 type %s\n",vfc::type_id_t<U4>().name());

	printf("\'d\' type %s\n",vfc::type_id('d').name());
	printf("100 type %s\n",vfc::type_id(100).name());
	printf("100.0 type %s\n",vfc::type_id(100.0).name());
	printf("\"str\" type %s\n",vfc::type_id("str").name());

	const char * str = "ok";
	printf("const char * str type %s\n",vfc::type_id(str).name());

	a * pa;
	printf("a type %s\n",vfc::type_id_t<a>().name());
	printf("pa type %s\n",vfc::type_id(pa).name());
	printf("a::test type %s\n",vfc::type_id(&a::test).name());
	printf("a::test type %s\n",vfc::type_id(&a::test1).name());
	printf("a::test type %s\n",vfc::type_id(&a::test2).name());
	printf("a::test type %s\n",vfc::type_id(&a::test3).name());
	printf("test %s\n",vfc::type_id(&test).name());
	
	typedef int (a::*TT)(const int *,char) const volatile;
	const TT * tt;
	printf("TT type %s\n",vfc::type_id_t<TT>().name());
	printf("const TT * type %s\n",vfc::type_id(tt).name());

	int* (*p1[5])(int, char*); 
	void (*p2[10]) (void (*)());
	printf("p1 type %s\n",vfc::type_id(p1).name());
	printf("p2 type %s\n",vfc::type_id(p2).name());
	
	return 0;
}







